
const express = require('express')
const router = require('./router')
const Joi = require('joi')  //定义验证规则
const expressJoi = require('@escook/express-joi') //自动对表单数据进行验证
const app = express()
const { db } = require("./db/index")
const cors = require('cors')
const config = require('./config')

app.use(cors()) // 一定要在路由之前配置cors中间件，解决接口跨域问题


// 解析请求体数据
app.use(express.json())
app.use(express.urlencoded({ extended: false }))


const expressJwt = require('express-jwt')


// 将jwt字符串解析还原成JSON对象  unless()配置不需要访问权限的接口
// 解析出来的用户信息挂载到req.user中
// app.use(expressJwt({ secret: config.jwtSecretKey }).unless({
//     path: [/^\/admin\/initial\//]
// }))


// 封装一个函数
app.use((req, res, next) => {
    res.cc = (err, status = 1) => {
        res.send({
            status,
            message: err instanceof Error ? err.message : err
        })
    }

    next()
})

// 调用路由，增加校验规则
app.use('/admin', router)


// 定义错误级别的中间件
app.use((err,req,res,next)=>{
    // 校验失败导致的错误
    if(err instanceof Joi.ValidationError) return res.cc(err)
// 未知的错误
res.cc(err)
    next()
})

// 解析失败
app.use((err, req, res, next) => {
    if (err.name === 'UnauthorizedError') {
        // token解析失败
        return res.send({
            status: 401,
            message: '无效token'
        })
    }
    res.send({
        status: 1,
        message: 'token错误',
        err:err
    })
})
// app.use((req,res,next)=>{
//   db.end()
//   next()
// })
app.listen(3030, () => {
    console.log('服务器已启动 http://127.0.0.1:3030')
})